package cn.com.login;

import javax.servlet.http.HttpServletRequest;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UnknownAccountException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import cn.com.shiroservice.LoginService;
import cn.com.word.bean.UserInfo;
import cn.com.word.myexception.MyException;

@Controller
public class LoginController {
	@Autowired
	LoginService loginService;
	
	/**
	 * 首页访问地址
	 * 
	 * 首页是需要用户登录之后才能访问的 因此 能进到该控制层方法 证明shiro的认证拦截器
	 * 已经认证通过了。
	 * @return
	 */
	@RequestMapping("/index")
	public String index(Model model){
		//shiro自定义realm  认证方法返回的SimpleAuthenticationInfo对象，第一个参数 就是这里Subject.getPrincipal()返回的值
		UserInfo userInfo=(UserInfo)SecurityUtils.getSubject().getPrincipal();
		model.addAttribute("userInfo", userInfo);
		
		return "index";
	}
	//拒绝访问之后统一提示页面
	@RequestMapping("/refuse")
	public String refuse(){
		return "refuse";
	}
	//登录页
	@RequestMapping("/loginpage")
	public String login(){
		return "login";
	}
	//生成验证码的jsp
	@RequestMapping("/validatecode")
	public String validatecode(){
		return "validatecode/validatecode";
	}
	
	/**
	 * 登陆地址就是shiro中配置的loginUrl对应的地址
	 * 
	 * 登陆表单所对应的控制层中  只针对异常进行相应的处理
	 * 不用考虑成功的情况。
	 * 当登陆成功之后  shiro会自动跳转到用户上一个请求的url（也可以在shiro.xml中配置登陆成功之后访问的url）
	 * @param request
	 * @return
	 * @throws MyException 
	 */
	@RequestMapping("/login")
	public String login(HttpServletRequest request) throws Exception{
//		//如果登陆失败从request中获取认证异常信息，shiroLoginFailure就是shiro异常类的全限定名
		String exceptionClassName=(String) request.getAttribute("shiroLoginFailure");
//		System.out.println(loginService.getSysPermissionByUserCode("zhangsan").get(0).getUrl());
		//根据shiro返回的异常类路径判断，抛出指定异常信息
		if(exceptionClassName!=null){
			if (UnknownAccountException.class.getName().equals(exceptionClassName)) {
				//最终会抛给异常处理器
				System.err.println("账号不存在");
				throw new MyException("账号不存在");
			} else if (IncorrectCredentialsException.class.getName().equals(
					exceptionClassName)) {
				System.err.println("用户名/密码错误");
				throw new MyException("用户名/密码错误");
			} else if("randomCodeError".equals(exceptionClassName)){
				System.err.println("验证码错误");
				throw new MyException("验证码错误 ");
			}else {
				throw new Exception();//最终在异常处理器生成未知错误
			}
		}
		//此方法不处理登陆成功（认证成功），shiro认证成功会自动跳转到上一个请求路径
		
		//登陆失败还到login页面
		System.out.println("login");
		return "login";
	}
	
}
